{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 关于使用xlwings的一点心得\n",
    "\n",
    "##### xlwings 的使用范围\n",
    "\n",
    "　　xlwings工具的作用在于帮助会Python不会excel的VBA的人的一个便捷工具，其实主要是调用了pywin32的功能，使用win32com也是可以的，但是友好性就不如xlwings了。\n",
    "　　我目前主要使用xlwings的地方在于公司存在加密的文件中，由于大量excel文件被加密，只能在公司的电脑上使用，我本人又不太会使用VBA，所以对于excel的自动化水平实在不高。\n",
    "　　幸运的是，我会Python和Pandas，所以在某些方面，我是不需要excel的，但是为了能对公司日常办公的数据进行处理，不得不研究如何利用Python操作Excel，事实上，xlwings帮了我很大的忙，通过xlwings我能很方便的调用Excel打开我需要的Excel文件，然后利用Pandas进行数据处理。\n",
    "我最近做的比较好的是，利用xlwings进行Excel文件的批量转制和大量Excel文件的合并。\n",
    "\n",
    "##### 文件的批量转制\n",
    "\n",
    "　　我有很多具有相同类型的和格式的Excel表格，我需要把该Excel表格的指定位置的数据提取到另一个Excel表格中，其实就是批量转制了，难点主要有两点:\n",
    "\n",
    "**1. ** 大致一致，存在细微的不同，处理时需要多次判断\n",
    "\n",
    "**2. ** 要读取该表格的页眉信息\n",
    "\n",
    "　　我的思路也很简单，找到需要转制的表格里信息，然后全部提取到内存中，利用Pandas进行处理，然后找到我要的信息的位置，然后将指定位置的信息提取到新的表格里。关键在于一个Excel文件中包含了很多sheet表，我需要用程序筛选出我想要的sheet表，而这个表目前存在多个名字，在这里处理上我还没有找到更好的办法。读取Excel指定Sheet表的页眉信息，由于之前也是没有接触过，所以也是看了好多文档，xlwings的文档里关于这一点写的不是很明白，API文档里是没有的，所以我是使用xlwings里调用宏的功能，然后写了一个读取页眉信息的宏，然后在程序里调用这个宏，读取我需要的页眉信息，确实是成功了，整体程序思路还是很清晰的，也比较简单。\n",
    "\n",
    "\n",
    "##### 文件的合并\n",
    "\n",
    "　　同一个Excel文件中有很多Sheet表，利用Excel进行合并确实很费时间，需要把所有的表格合并到一起很费时间，当然也可能是我知不道有什么更高级的办法来做到这一点，我只能用我的“笨办法”了。我用xlwings读取该Excel文件，再利用Pandas将不同Sheet表合并到一起，最后再进行筛选和计算。当然这样写代码也很费时间，不过随着代码越来越多，重复利用率很高，相对Excel的一步步操作还是省了很多时间的。用宏的话应该也是可以的，不过我并不知道该怎样用，关键是宏对于文本的处理比较蠢，相对于Python的字符串工具，Excel就显得太笨重了。\n",
    "\n",
    "　　最后就是关于脚本的改进了，也是今晚突然想到的办法，也确实是自己太愚蠢了。\n",
    "\n",
    "##### 代码的优化\n",
    "\n",
    "　　1. 如何判断Sheet表是否可见\n",
    "　　2. 如何读取Excel某一Sheet标的页眉信息\n",
    "\n",
    "　　第一个问题，也是我在数据合并和选择我需要的Sheet表时遇到的最主要的问题，有很多Sheet表是不希望见到的，也是不希望读取到的，因此我希望选择表格是希望可见的，我只需要在可见的表格里找到我需要的表格就好了，因此对于Sheet表的是否隐藏，即Sheet表的可见性在这里的逻辑判断上显得尤为重要了。我之前采用的办法比较笨，找到一个Excel文件中所有的Sheet表，然后通过多重条件判断筛选出我需要的Sheet表，但是呢，面临的情况是很容易出错，尤其是在第二个问题上，我使用了宏，也是需要这样的，实在是经常出现bug，很让人苦恼。因为我需要读取指定Excel的指定Sheet表的页眉信息，Sheet表的选择也是页眉信息获取的前提了，该如何去做好这一点呢？\n",
    "\n",
    "　　这个是我程序修改必须要克服的地方，经过今晚的思考，我找到了办法，通过pywin32的api调用excel的sheet表的可见属性\n",
    "\n",
    "```\n",
    "for i in xw.sheets:\n",
    "    if i.api.visible == -1:\n",
    "       print(i, 'is visible')\n",
    "```\n",
    "\n",
    "　　其实要说有多难吗，其实并没有，关键是我不知道设个api的作用是什么，今晚通过通读xlwings的API文档以及看了大神们写的文章后，仔细才明白这个其实就暗含了Excel的宏的功能，完全没有必要用xlwings调用宏了。\n",
    "根据这一点，我对于读取指定Sheet表的页眉信息，也有了眉目，根据之前写的宏代码，其实页眉信息主要在sheet表的pagesetup对象中：\n",
    "\n",
    "```\n",
    "sht = xw.sheets[0]\n",
    "sht.api.pagesetup.centerheader\n",
    "```\n",
    "xlwings的封装很完美，如果能够对于xlwings的API文档更加完善就好了，尤其是关于api的功能需要与pywin32的文档更加紧密的结合起来。\n",
    "不得不说，Python真的很Python，人生苦短，我用Python"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
